<?php $GLOBALS['_beginTime'] = microtime(TRUE);
defined('HIDE_DIR') or define('HIDE_DIR','./app');
defined('UPLOADS_PATH') or define('UPLOADS_PATH','./Uploads/');
defined('PUBLIC_PATH') or define('PUBLIC_PATH','./Public/');
defined('UPLOADS_URL') or define('UPLOADS_URL','Uploads/');
defined('PUBLIC_URL') or define('PUBLIC_URL','Public/');
defined('MODE_NAME') or define('MODE_NAME','Cli');
defined('APP_NAME') or define('APP_NAME','Home');
defined('APP_PATH') or define('APP_PATH','./app/Home/');
defined('RUNTIME_PATH') or define('RUNTIME_PATH','./app/Home/Runtime/');
defined('RUNTIME_FILE') or define('RUNTIME_FILE','./app/Home/Runtime/~Cli_runtime.php');
defined('MEMORY_LIMIT_ON') or define('MEMORY_LIMIT_ON',true);
defined('EXT') or define('EXT','.class.php');
defined('JETEE_PATH') or define('JETEE_PATH','E:\\w\\my_share\\ma863.tk\\jetee/');
defined('APP_DEBUG') or define('APP_DEBUG',false);
defined('BUILD_DIR_SECURE') or define('BUILD_DIR_SECURE',true);
defined('OPCACHE_ENABLE') or define('OPCACHE_ENABLE',false);
defined('JETEE_VERSION') or define('JETEE_VERSION','1.0.2');
defined('IS_CGI') or define('IS_CGI',0);
defined('IS_WIN') or define('IS_WIN',1);
defined('IS_CLI') or define('IS_CLI',1);
defined('CORE_PATH') or define('CORE_PATH','E:\\w\\my_share\\ma863.tk\\jetee/Lib/');
defined('EXTEND_PATH') or define('EXTEND_PATH','E:\\w\\my_share\\ma863.tk\\jetee/Extend/');
defined('MODE_PATH') or define('MODE_PATH','E:\\w\\my_share\\ma863.tk\\jetee/Mode/');
defined('ENGINE_PATH') or define('ENGINE_PATH','./app/Home/Extend/Engine/Jetee/');
defined('VENDOR_PATH') or define('VENDOR_PATH','E:\\w\\my_share\\ma863.tk\\jetee/Extend/Vendor/');
defined('LIBRARY_PATH') or define('LIBRARY_PATH','E:\\w\\my_share\\ma863.tk\\jetee/Extend/Library/');
defined('COMMON_PATH') or define('COMMON_PATH','./app/Home/Common/');
defined('LIB_PATH') or define('LIB_PATH','./app/Home/Lib/');
defined('CONF_PATH') or define('CONF_PATH','./app/Home/Conf/');
defined('LANG_PATH') or define('LANG_PATH','./app/Home/Lang/');
defined('TMPL_PATH') or define('TMPL_PATH','./app/Home/Tpl/');
defined('HTML_PATH') or define('HTML_PATH','./app/Home/Runtime/Html/');
defined('LOG_PATH') or define('LOG_PATH','./app/Home/Runtime/Logs/');
defined('TEMP_PATH') or define('TEMP_PATH','./app/Home/Runtime/Temp/');
defined('DATA_PATH') or define('DATA_PATH','./app/Home/Runtime/Data/');
defined('CACHE_PATH') or define('CACHE_PATH','./app/Home/Runtime/Cache/');
if(MEMORY_LIMIT_ON) $GLOBALS['_startUseMems'] = memory_get_usage();if(PHP_SAPI!='cli')header_remove('X-Powered-By');set_include_path(get_include_path() . PATH_SEPARATOR . VENDOR_PATH);
 

/**
 * Think 基础函数库
 * @category   Think
 * @package  Common
 * @author   liu21st <liu21st@gmail.com>
 */

/**
 * 获取模版文件 格式 项目://分组@主题/模块/操作
 * @param string $name 模版资源地址
 * @param string $layer 视图层（目录）名称
 * @return string
 */
function T($template='',$layer=''){
		if(is_file($template)) {
			return $template;
		}
		// 解析模版资源地址
		if(false === strpos($template,'://')){
			$template   =   APP_NAME.'://'.str_replace(':', '/',$template);
		}        
		$info   =   parse_url($template);
		$file   =   $info['host'].(isset($info['path'])?$info['path']:'');
		$group  =   isset($info['user'])?$info['user'].'/':(defined('GROUP_NAME')?GROUP_NAME.'/':'');
		$app    =   $info['scheme'];
		$layer  =   $layer?$layer:C('DEFAULT_V_LAYER');

		// 获取当前主题的模版路径
		if(($list = C('EXTEND_GROUP_LIST')) && isset($list[$app])){ // 扩展分组
			$baseUrl    =   $list[$app].'/'.$group.$layer.'/';
		}else{ 
			$baseUrl    =   TMPL_PATH.$group;
		}

		// 分析模板文件规则
		if('' == $file) {
			// 如果模板文件名为空 按照默认规则定位
			$file = MODULE_NAME . C('TMPL_FILE_DEPR') . ACTION_NAME;
		}elseif(false === strpos($file, '/')){
			$file = MODULE_NAME . C('TMPL_FILE_DEPR') . $file;
		}
		return $baseUrl.$file.C('TMPL_TEMPLATE_SUFFIX');
}

/**
 * 获取输入参数 支持过滤和默认值
 * 使用方法:
 * <code>
 * I('id',0); 获取id参数 自动判断get或者post
 * I('post.name','','htmlspecialchars'); 获取$_POST['name']
 * I('get.'); 获取$_GET
 * </code> 
 * @param string $name 变量的名称 支持指定类型
 * @param mixed $default 不存在的时候默认值
 * @param mixed $filter 参数过滤方法
 * @return mixed
 */
function I($name,$default='',$filter=null,$is_array=false) {
	if(strpos($name,'.')) { // 指定参数来源
		list($method,$name) =   explode('.',$name,2);
	}else{ // 默认为自动判断
		$method = 'param';
	}
	switch(strtolower($method)) {
		case 'get'     :   $input =& $_GET;break;
		case 'post'    :   $input =& $_POST;break;
		case 'put'     :   parse_str(file_get_contents('php://input'), $input);break;
		case 'param'   :  
			switch($_SERVER['REQUEST_METHOD']) {
				case 'POST':
					$input  =  $_POST;
					break;
				case 'PUT':
					parse_str(file_get_contents('php://input'), $input);
					break;
				default:
					$input  =  $_GET;
			}
			break;
		case 'request' :   $input =& $_REQUEST;   break;
		case 'session' :   $input =& $_SESSION;   break;
		case 'cookie'  :   $input =& $_COOKIE;    break;
		case 'server'  :   $input =& $_SERVER;    break;
		case 'globals' :   $input =& $GLOBALS;    break;
		default:
			return NULL;
	}
	if(empty($name)) { // 获取全部变量
		$data       =   $input; 
		$filters    =   isset($filter)?$filter:C('DEFAULT_FILTER');
		if($filters) {
			$filters    =   explode(',',$filters);
			foreach($filters as $filter){
				$data   =   array_map($filter,$data); // 参数过滤
			}
		}        
	}elseif(isset($input[$name])) { // 取值操作
		$data       =	$input[$name];
		$filters    =   isset($filter)?$filter:C('DEFAULT_FILTER');
		if($filters) {
			$filters    =   explode(',',$filters);
			foreach($filters as $filter){
				if(function_exists($filter)) {
					$data   =   $is_array && is_array($data) ? array_map($filter,$data): $filter($data); // 参数过滤
				}else{
					$data   =   filter_var($data,is_int($filter)?$filter:filter_id($filter));
					if(false === $data) {
						return	 isset($default)?$default:NULL;
					}
				}
			}
		}
	}else{ // 变量默认值
		$data       =	 isset($default)?$default:NULL;
	}
	is_array($data) && array_walk_recursive($data,'think_filter');
	return $data;
}

/**
 * 记录和统计时间（微秒）和内存使用情况
 * 使用方法:
 * <code>
 * G('begin',floatval)  // 记录标记位
 * echo G('begin','end',8)  //end可以不定义 精确到小数后8位
 * G('begin'); // 记录开始标记位
 * // ... 区间运行代码
 * G('end'); // 记录结束标签位
 * echo G('begin','end',6); // 统计区间运行时间 精确到小数后6位
 * echo G('begin','end','m'); // 统计区间内存使用情况
 * 如果end标记位没有定义，则会自动以当前作为标记位
 * 其中统计内存使用需要 MEMORY_LIMIT_ON 常量为true才有效
 * </code>
 * @param string $start 开始标签
 * @param string $end 结束标签
 * @param integer|string $dec 小数位或者m 
 * @return mixed
 */
function G($start,$end='',$dec=4) {
	static $_info       =   array();
	static $_mem        =   array();
	if(is_float($end)) { // 记录时间
		$_info[$start]  =   $end;
	}elseif(!empty($end)){ // 统计时间和内存使用
		if(!isset($_info[$end])) $_info[$end]       =  microtime(TRUE);
		if(MEMORY_LIMIT_ON && $dec=='m'){
			if(!isset($_mem[$end])) $_mem[$end]     =  memory_get_usage();
			return number_format(($_mem[$end]-$_mem[$start])/1024);          
		}else{
			return number_format(($_info[$end]-$_info[$start]),$dec);
		}       
			
	}else{ // 记录时间和内存使用
		$_info[$start]  =  microtime(TRUE);
		if(MEMORY_LIMIT_ON) $_mem[$start]           =  memory_get_usage();
	}
}

/**
 * 设置和获取统计数据
 * 使用方法:
 * <code>
 * N('db',1); // 记录数据库操作次数
 * N('read',1); // 记录读取次数
 * echo N('db'); // 获取当前页面数据库的所有操作次数
 * echo N('read'); // 获取当前页面读取次数
 * </code> 
 * @param string $key 标识位置
 * @param integer $step 步进值
 * @return mixed
 */
function N($key, $step=0,$save=false) {
	static $_num    = array();
	if (!isset($_num[$key])) {
		$_num[$key] = (false !== $save)? S('N_'.$key) :  0;
	}
	if (empty($step))
		return $_num[$key];
	else
		$_num[$key] = $_num[$key] + (int) $step;
	if(false !== $save){ // 保存结果
		S('N_'.$key,$_num[$key],$save);
	}
}

/**
 * 字符串命名风格转换
 * type 0 将Java风格转换为C的风格 1 将C风格转换为Java的风格
 * @param string $name 字符串
 * @param integer $type 转换类型
 * @return string
 */
function parse_name($name, $type=0) {
	if ($type) {
		return ucfirst(preg_replace_callback('/_([a-zA-Z])/',  function($m){return strtoupper($m[1]);}, $name));
	} else {
		return strtolower(trim(preg_replace("/[A-Z]/", "_\\0", $name), "_"));
	}
}

/**
 * 优化的require_once  不重复加载
 * @param string $filename 文件地址
 * @return boolean
 */
function require_cache($filename) {
	static $_importFiles = array();
	if (!isset($_importFiles[$filename])) {
		if (file_exists_case($filename)) {
			require $filename;
			$_importFiles[$filename] = true;
		} else {
			$_importFiles[$filename] = false;
		}
	}
	return $_importFiles[$filename];
}

/**
 * 批量导入文件 成功则返回
 * @param array $array 文件数组
 * @param boolean $return 加载成功后是否返回
 * @return boolean
 */
function require_array($array,$return=false){
	foreach ($array as $file){
		if (require_cache($file) && $return) return true;
	}
	if($return) return false;
}

/**
 * 区分大小写的文件存在判断
 * @param string $filename 文件地址
 * @return boolean
 */
function file_exists_case($filename) {
	if (is_file($filename)) {
		if (IS_WIN && C('APP_FILE_CASE')) {
			if (basename(realpath($filename)) != basename($filename))
				return false;
		}
		return true;
	}
	return false;
}


/**
 * 基于命名空间方式导入函数库   默认调用EXTEND_PATH/Function/下  
 * load('@.function')
 * @param string $name 函数库命名空间字符串 			@.function 表示调用项目公共目录Common/function.php
 * @param string $baseUrl 起始路径
 * @param string $ext 导入的文件扩展名
 * @return void
 */
function load($name, $baseUrl='', $ext='.php') {
	$name = str_replace(array('.', '#'), array('/', '.'), $name);
	if (empty($baseUrl)) {
		if (0 === strpos($name, '@/')) {
			//加载当前项目函数库
			$baseUrl    = COMMON_PATH;
			$name       = substr($name, 2);
		} else {
			//加载JETEE 系统函数库
			$baseUrl    = EXTEND_PATH . 'Function/';
		}
	}
	if (substr($baseUrl, -1) != '/')
		$baseUrl       .= '/';
	require_cache($baseUrl . $name . $ext);
}

/**
 * 快速导入第三方框架类库 所有第三方框架的类库文件统一放到 系统的Vendor目录下面
 * @param string $class 类库
 * @param string $baseUrl 基础目录
 * @param string $ext 类库后缀 
 * @return boolean
 */
function vendor($class, $baseUrl = '', $ext='.php') {
	if (empty($baseUrl))
		$baseUrl = VENDOR_PATH;
	return require_cache($baseUrl.$class.$ext);
}


/**
 * A函数用于实例化Action 格式：[项目://][分组/]模块   @/group/module
 * @param string $name Action资源地址
 * @param string $layer 控制层名称
 * @param boolean $common 是否公共目录
 * @return Action|false
 */
function A($name,$layer='',$common=false) {
	static $_action = array();
	$layer      =   $layer?$layer:C('DEFAULT_C_LAYER');//Action
	if(strpos($name,'://')) {// 指定项目
		$name   =  dirname(APP_PATH).'/'.str_replace('://','/Lib/'.$layer.'/',$name);
	}else{
		$name   =  '@/'.$layer.'/'.$name;
	}
	if(isset($_action[$name]))  return $_action[$name];
	$path           =   explode('/',$name);
	if($common) { // 加载公共类库目录
		require_cache(LIB_PATH . str_replace('@/','',$name).$layer.EXT);
	}else{
		require_cache(str_replace('@/',LIB_PATH,$name).$layer.EXT);
	}
	$class      =   basename($name.$layer);
	if(class_exists($class,false)) {
		$action             =   new $class();
		$_action[$name]     =   $action;
		return $action;
	}else {
		return false;
	}
}

/**
 * 远程调用模块的操作方法 URL 参数格式 [项目://][分组/]模块/操作
 * @param string $url 调用地址
 * @param string|array $vars 调用参数 支持字符串和数组 
 * @param string $layer 要调用的控制层名称
 * @return mixed
 */
function R($url,$vars=array(),$layer='') {
	$info   =   pathinfo($url);
	$action =   $info['basename'];
	$module =   $info['dirname'];
	$class  =   A($module,$layer);
	if($class){
		if(is_string($vars)) {
			parse_str($vars,$vars);
		}
		return call_user_func_array(array(&$class,$action.C('ACTION_SUFFIX')),$vars);
	}else{
		return false;
	}
}

/**
 * 获取和设置语言定义(区分大小写)
 * @param string|array $name 语言变量
 * @param string $value 语言值
 * @return mixed
 */
function L($name=null, $value=null) {
	static $_lang = array();
	// 空参数返回所有定义
	if (empty($name))
		return $_lang;
	// 判断语言获取(或设置)
	// 若不存在,直接返回
	if (is_string($name)) {
		if (!strpos($name, '.')) {
			if (is_null($value))
				return isset($_lang[$name]) ? $_lang[$name] : $name;
			$_lang[$name] = $value;
			return;
		}
		// 二维数组设置和获取支持
		$name = explode('.', $name);
		if (is_null($value))
			return isset($_lang[$name[0]][$name[1]]) ? $_lang[$name[0]][$name[1]] : $name[1];
		$_lang[$name[0]][$name[1]] = $value;
		return;
	}
	// 批量定义
	if (is_array($name))
		$_lang = array_merge($_lang, $name);
	return null; // 避免非法参数
}

/**
 * 获取和设置配置参数 支持批量定义
 * @param string|array $name 配置变量   字条 一级数组 不区分大小写
 * @param mixed $value 配置值
 * @return mixed
 */
function C($name=null, $value=null) {
	static $_config = array();
	// 无参数时获取所有
	if (empty($name)) {
		if(!empty($value) && $array = json_decode(S('c_'.$value,true),true)) {
			$_config = array_merge($_config, array_change_key_case($array));
		}
		return $_config;
	}
	// 优先执行设置获取或赋值
	if (is_string($name)) {
		if (!strpos($name, '.')) {
			$name = strtolower($name);
			if (is_null($value))
				return isset($_config[$name]) ? $_config[$name] : null;
			$_config[$name] = $value;
			return;
		}
		// 二维数组设置和获取支持
		$name = explode('.', $name);
		$name[0]   =  strtolower($name[0]);
		if (is_null($value))
			return isset($_config[$name[0]][$name[1]]) ? $_config[$name[0]][$name[1]] : null;
		$_config[$name[0]][$name[1]] = $value;
		return;
	}
	// 批量设置
	if (is_array($name)){
		$_config = array_merge($_config, array_change_key_case($name));
		if(!empty($value)) {// 保存配置值
			S('c_'.$value,json_encode($_config));
		}
	   return;
	}
	return null; // 避免非法参数
}

/**
 * 处理标签扩展
 * @param string $tag 标签名称
 * @param mixed $params 传入参数
 * @return mixed
 */
function tag($tag, &$params=NULL) {
	// 系统标签扩展
	$tags    = C('tags.' . $tag);
	if($tags) {
		if(APP_DEBUG) {
			G($tag.'Start');
			trace('[ '.$tag.' ] --START--','','INFO');
		}
		// 执行扩展
		foreach ($tags as $key=>$name) {
			if(!is_int($key)) { // 指定行为类的完整路径 用于模式扩展
				$name   = $key;
			}
			B($name, $params);
		}
		if(APP_DEBUG) { // 记录行为的执行日志
			trace('[ '.$tag.' ] --END-- [ RunTime:'.G($tag.'Start',$tag.'End',6).'s ]','','INFO');
		}
	}else{ // 未执行任何行为 返回false
		return false;
	}
}

/**
 * 动态添加行为扩展到某个标签
 * @param string $tag 标签名称
 * @param string $behavior 行为名称
 * @param string $path 行为路径 
 * @return void
 */
function add_tag_behavior($tag,$behavior,$path='') {
	$array      =  C('tags.'.$tag);
	if(!$array) {
		$array  =  array();
	}
	if($path) {
		$array[$behavior] = $path;
	}else{
		$array[] =  $behavior;
	}
	C('tags.'.$tag,$array);
}

/**
 * 执行某个行为
 * @param string $name 行为名称
 * @param Mixed $params 传入的参数
 * @return void
 */
function B($name, &$params=NULL) {
	if(strpos($name,'/')){
		list($name,$method) = explode('/',$name);
	}else{
		$method     =   'run';
	}
	$class      = $name.'Behavior';
	if(APP_DEBUG) {
		G('behaviorStart');
	}
	$behavior   = new $class();
	$behavior->$method($params);
	if(APP_DEBUG) { // 记录行为的执行日志
		G('behaviorEnd');
		trace($name.' Behavior ::'.$method.' [ RunTime:'.G('behaviorStart','behaviorEnd',6).'s ]','','INFO');
	}
}

/**
 * 去除代码中的空白和注释
 * @param string $content 代码内容
 * @return string
 */
function strip_whitespace($content) {
	$stripStr   = '';
	//分析php源码
	$tokens     = token_get_all($content);
	$last_space = false;
	for ($i = 0, $j = count($tokens); $i < $j; $i++) {
		if (is_string($tokens[$i])) {
			$last_space = false;
			$stripStr  .= $tokens[$i];
		} else {
			switch ($tokens[$i][0]) {
				//过滤各种PHP注释
				case T_COMMENT:
				case T_DOC_COMMENT:
					break;
				//过滤空格
				case T_WHITESPACE:
					if (!$last_space) {
						$stripStr  .= ' ';
						$last_space = true;
					}
					break;
				case T_START_HEREDOC:
					$stripStr .= "<<<THINK\n";
					break;
				case T_END_HEREDOC:
					$stripStr .= "THINK;\n";
					for($k = $i+1; $k < $j; $k++) {
						if(is_string($tokens[$k]) && $tokens[$k] == ';') {
							$i = $k;
							break;
						} else if($tokens[$k][0] == T_CLOSE_TAG) {
							break;
						}
					}
					break;
				default:
					$last_space = false;
					$stripStr  .= $tokens[$i][1];
			}
		}
	}
	return $stripStr;
}
/**
 * 添加和获取页面Trace记录
 * @param string $value 变量
 * @param string $label 标签
 * @param string $level 日志级别 
 * @param boolean $record 是否记录日志
 * @return void
 */
function trace($value='[think]',$label='',$level='DEBUG',$record=false) {
	static $_trace =  array();
	if('[think]' === $value){ // 获取trace信息
		return $_trace;
	}else{
		$info   =   ($label?$label.':':'').print_r($value,true);
		if('ERR' == $level && C('TRACE_EXCEPTION')) {// 抛出异常
			throw_exception($info);
		}
		$level  =   strtoupper($level);
		if(!isset($_trace[$level])) {
				$_trace[$level] =   array();
			}
		$_trace[$level][]   = $info;
		if((defined('IS_AJAX') && IS_AJAX) || C('LOG_RECORD')  || $record) {
			Log::record($info,$level,$record);
		}
	}
}



/**
 * E函数用于实例化一个有用模型文件的Model(connection)     如E('Store')->lists();
 * @param string $name Model名称 支持指定基础模型 例如 MongoModel:User
 * @param string $tablePrefix 表前缀
 * @return Model
 */
function E($table,$layer=''){
	static $_model  = array();
	if (!isset($_model[$table])){
		$layer=$layer?$layer:C('DEFAULT_M_LAYER');
		$t=$table.$layer;
		$_model[$table] = new $t();
	}
	return $_model[$table];
}
/**
 * db函数用于实例化connection
 * @param string $table  默认空不设置表名 		db('user u')
 * @param string $prefix 表前缀  NULL为没有前缀 ''为加C('DB_PREFIX')
 * @return $connection 数据库连接信息
 */
function db($table='',$prefix=''){
    static $db=null;
	if(!$db){
		require_once CORE_PATH.'Core/PdoMysql.class.php';
		$db = new Core\PdoMysql(C('DB_HOST'), C('DB_USER'), C('DB_PWD'), C('DB_NAME'));
	}
	if($table!==''){
		if($prefix!==NULL){
			$table=$prefix==='' ? C('DB_PREFIX').$table : $prefix.$table;
		}
		$db->setTable($table);
		$db->fromRaw($db->getTable());
	}
	return $db;
}

function p($a,$t=false){
	return print_r($a,$t);
}
 
/**
 * 框架 Portal类  核心类   根据模型配置载入指定文件
 */
class Jetee {
	// 类映射
	private static $_map      = array();
	// 实例化对象
	private static $_instance = array();
	/**
	 * 应用程序初始化
	 * @access public
	 * @return void
	 */
	static public function start() {
		if(MODE_NAME=='Jetee'){
			header('Referrer-Policy: no-referrer');//跳转是否加来源
			if(IS_SSL) header('Strict-Transport-Security: max-age=31536000');//只能用https访问
			//header('X-Frame-Options: SAMEORIGIN');//页面只能被本站页面嵌入到iframe或者frame中。
			header('X-XSS-Protection: 1; mode=block');
			header('X-Content-Type-Options: nosniff');
			//header("Content-Security-Policy:default-src 'self'; script-src 'self' https://apps.bdimg.com; connect-src 'self'; img-src 'self'; style-src 'self' https://apps.bdimg.com");
		}
		/*/ 设定错误和异常处理*/
		register_shutdown_function(array('Jetee','fatalError'));//定义PHP程序执行完成或意外死掉后执行的函数
		set_error_handler(array('Jetee','appError'));// 设置一个用户定义的错误处理函数
		set_exception_handler(array('Jetee','appException'));//自定义异常处理。
		// 注册AUTOLOAD方法
		spl_autoload_register(array('Jetee', 'autoload'));
		
		// 运行应用	
		App::run();
		return;
	}

	

	// 注册classmap
	static public function addMap($class, $map=''){
		if(is_array($class)){
			self::$_map = array_merge(self::$_map, $class);
		}else{
			self::$_map[$class] = $map;
		}        
	}

	// 获取classmap
	static public function getMap($class=''){
		if(''===$class){
			return self::$_map;
		}elseif(isset(self::$_map[$class])){
			return self::$_map[$class];
		}else{
			return null;
		}
	}
	/**
	 * 系统自动加载框架类库
	 * 并且支持配置自动加载路径
	 * @param string $class 对象类名
	 * @return void
	 */
	public static function autoload($class) {
		// 检查是否存在映射
		if(isset(self::$_map[$class])) {
			include self::$_map[$class];
			return;
		}
		$group      =   defined('GROUP_NAME') ?GROUP_NAME.'/':'';
		$file       =   $class.'.class.php';
		if(substr($class,-8)=='Behavior') { // 加载行为
			if(require_array(array(
				CORE_PATH.'Behavior/'.$file,
				LIB_PATH.'Behavior/'.$file,
				MODE_PATH.MODE_NAME.'/Behavior/'.$file),true)) {
				return ;
			}
		}elseif(substr($class,-5)=='Model'){ // 加载模型
			if(require_array(array(
				LIB_PATH.'Model/'.$file,
				LIB_PATH.'Model/'.$group.$file),true)) {
				return ;
			}
		}elseif(substr($class,-6)=='Action'){ // 加载控制器
			if(require_array(array(
				LIB_PATH.'Action/'.$group.$file,
				LIB_PATH.'Action/'.$file),true)) {
				return ;
			}
		}elseif(substr($class,0,5)=='Cache'){ // 加载缓存驱动
			if(require_cache(CORE_PATH.'Driver/Cache/'.$file)){
				return ;
			}
		}elseif(substr($class,0,7)=='Session'){ // 加载Session驱动
			if(require_cache(CORE_PATH.'Driver/Session/'.$file)){
				return ;
			}
		}elseif(substr($class,0,2)=='Db'){ // 加载数据库驱动
			if(require_cache(CORE_PATH.'Driver/Db/'.$file)){
				return ;
			}
		}elseif(substr($class,0,8)=='Template'){ // 加载模板引擎驱动
			if(require_cache(CORE_PATH.'Template/'.$file)){
				return ;
			}
		}elseif(substr($class,0,6)=='TagLib'){ // 加载标签库驱动
			if(require_cache(CORE_PATH.'Driver/TagLib/'.$file)) {
				return ;
			}
		}elseif(require_cache(LIB_PATH.'Vendor/'.$file))
			return ;
	}

	/**
	 * 取得对象实例 支持调用类的静态方法
	 * @param string $class 对象类名
	 * @param string $method 类的静态方法名
	 * @return object
	 */
	static public function instance($class,$method='') {
		$identify   =   $class.$method;
		if(!isset(self::$_instance[$identify])) {
			if(class_exists($class)){
				$o = new $class();
				if(!empty($method) && method_exists($o,$method))
					self::$_instance[$identify] = call_user_func_array(array(&$o, $method));
				else
					self::$_instance[$identify] = $o;
			}
			else
				halt(L('_CLASS_NOT_EXIST_').':'.$class);
		}
		return self::$_instance[$identify];
	}

	/**
	 * 自定义异常处理
	 * @access public
	 * @param mixed $e 异常对象
	 */
	static public function appException($e) {
		$error = array();
		$error['message']   = $e->getMessage();
		$trace  =   $e->getTrace();
		if('throw_exception'==$trace[0]['function']) {
			$error['file']  =   $trace[0]['file'];
			$error['line']  =   $trace[0]['line'];
		}else{
			$error['file']      = $e->getFile();
			$error['line']      = $e->getLine();
		}
		Log::record($error['message'],Log::ERR);
		halt($error);
	}

	/**
	 * 自定义错误处理
	 * @access public
	 * @param int $errno 错误类型
	 * @param string $errstr 错误信息
	 * @param string $errfile 错误文件
	 * @param int $errline 错误行数
	 * @return void
	 */
	static public function appError($errno, $errstr, $errfile, $errline) {
	  switch ($errno) {
		  case E_ERROR:
		  case E_PARSE:
		  case E_CORE_ERROR:
		  case E_COMPILE_ERROR:
		  case E_USER_ERROR:
			ob_end_clean();
			// 页面压缩输出支持
			if(C('OUTPUT_ENCODE')){
				$zlib = ini_get('zlib.output_compression');
				if(empty($zlib)) ob_start('ob_gzhandler');
			}
			$errorStr = "$errstr ".$errfile." 第 $errline 行.";
			if(C('LOG_RECORD')) Log::write("[$errno] ".$errorStr,Log::ERR);
			function_exists('halt')?halt($errorStr):exit('ERROR:'.$errorStr);
			break;
		  case E_STRICT:
		  case E_USER_WARNING:
		  case E_USER_NOTICE:
		  default:
			$errorStr = "[$errno] $errstr ".$errfile." 第 $errline 行.";
			trace($errorStr,'','NOTIC');
			break;
	  }
	}
	
	// 致命错误捕获  PHP执行完成或意外死掉后
	static public function fatalError() {
		// 保存日志记录
		if(C('LOG_RECORD')) Log::save();
		if ($e = error_get_last()) {
			switch($e['type']){
			  case E_ERROR:
			  case E_PARSE:
			  case E_CORE_ERROR:
			  case E_COMPILE_ERROR:
			  case E_USER_ERROR:  
				ob_end_clean();
				function_exists('halt')?halt($e):exit('ERROR:'.$e['message']. ' in <b>'.$e['file'].'</b> on line <b>'.$e['line'].'</b>');
				break;
			}
		}
	}

}
 

/**
 * 系统异常基类
 */
class JeteeException extends Exception {
}
 
/**
 * JETEE Behavior基础类
 * @category   Think
 * @package  Think
 * @subpackage  Core
 * @author liu21st <liu21st@gmail.com>
 */
abstract class Behavior {

    // 行为参数 和配置参数设置相同
    protected $options =  array();

   /**
     * 架构函数
     * @access public
     */
    public function __construct() {
        if(!empty($this->options)) {
            foreach ($this->options as $name=>$val){
                if(NULL !== C($name)) { // 参数已设置 则覆盖行为参数
                    $this->options[$name]  =  C($name);
                }else{ // 参数未设置 则传入默认值到配置
                    C($name,$val);
                }
            }
            array_change_key_case($this->options);
        }
    }
    
    // 获取行为参数
    public function __get($name){
        return $this->options[strtolower($name)];
    }

    /**
     * 执行行为 run方法是Behavior唯一的接口
     * @access public
     * @param mixed $params  行为参数
     * @return void
     */
    abstract public function run(&$params);

}
 
/**
 *  命令行模式公共函数库
 * @category   Think
 * @package  Common
 * @author   liu21st <liu21st@gmail.com>
 */

// 错误输出
function halt($error) {
	Log::write(print_r($error,true));
    //exit(mb_convert_encoding($error, 'GBK', 'UTF-8')); 
}

// 自定义异常处理
function throw_exception($msg, $type='ThinkException', $code=0) {
    halt($msg);
}

function initCache($name='',$options=null){
	static $cache   =   '';
	if(is_array($name)) { // 缓存初始化
		$type       =   isset($name['type'])?$name['type']:'';
		$cache      =   Cache::getInstance($type,$name);
	}elseif(empty($cache)) { // 自动初始化
		if(is_array($options)){
			$type       =   isset($options['type'])?$options['type']:'';
			$cache      =   Cache::getInstance($type,$options);
		}else $cache      =   Cache::getInstance();
	}
	return $cache;
}
/**
 * 缓存管理
 * @param mixed $name 缓存名称，如果为数组表示进行缓存设置
 * @param mixed $value 缓存值
 * @param mixed $options 缓存参数  如果是数字为过期时间秒
 * @return mixed  取值不存在 返回false
 */
function S($name,$value='',$options=null){
	$cache=initCache($name,$options);
	if(''=== $value){//获取缓存
		return $cache->g($name);
	}elseif(is_null($value)) {//删除缓存
		return $cache->rm($name);
	}else {//缓存数据
		if(is_array($options)) {
			$expire     =   isset($options['expire'])?$options['expire']:NULL;
		}else{
			$expire     =   is_int($options)?$options:NULL;
		}
		return $cache->s($name, $value, $expire);
	}
}
/**
 * 缓存数组管理
 * @param mixed $name 缓存名称，如果为数组表示进行缓存设置
 * @param mixed $arr 键值对
 * @param mixed $options 缓存参数  如果是数字为过期时间秒
 * @return mixed
 */
function hm($name,$arr='',$options=null) {
	$cache=initCache($name,$options);
	if(''=== $arr){ // 获取缓存
		return $cache->hGetAll($name);
	}elseif(is_null($arr)) { // 删除缓存
		return $cache->rm($name);
	}else{ //缓存数据
		if(is_array($options)) {
			$expire     =   isset($options['expire'])?$options['expire']:NULL;
		}else{
			$expire     =   is_int($options)?$options:NULL;
		}
		return $cache->hmSet($name, $arr, $expire);
	}
}
/**
 * 缓存数组键值管理
 * @param mixed $name 缓存名称，如果为数组表示进行缓存设置
 * @param mixed $key 键
 * @param mixed $val 值
 * @param mixed $options 缓存参数  如果是数字为过期时间秒
 * @return mixed
 */
function h($name,$key,$val='',$options=null) {
	$cache=initCache($name,$options);
	if(''=== $val){// 获取缓存
		return $cache->hGet($name,$key);
	}elseif(is_null($val)) { // 删除缓存
		return $cache->rm($name);
	}else{//缓存数据
		if(is_array($options)) {
			$expire     =   isset($options['expire'])?$options['expire']:NULL;
		}else{
			$expire     =   is_int($options)?$options:NULL;
		}
		return $cache->hSet($name, $key, $val, $expire);
	}
}
/**
 * 快速文件数据读取和保存 针对简单类型数据 字符串、数组
 * @param string $name 缓存名称
 * @param mixed $value 缓存值
 * @param string $path 缓存路径
 * @return mixed
 */
function F($name, $value='', $path=DATA_PATH) {
	static $_cache  = array();
	$filename       = $path . $name . '.php';
	if ('' !== $value) {
		if (is_null($value)) {
			// 删除缓存
			return false !== strpos($name,'*')?array_map("unlink", glob($filename)):unlink($filename);
		} else {
			// 缓存数据
			$dir            =   dirname($filename);
			// 目录不存在则创建
			if (!is_dir($dir))
				mkdir($dir,0755,true);
			$_cache[$name]  =   $value;
			$return=file_put_contents($filename, strip_whitespace("<?php\treturn " . var_export($value, true) . ";?>"));
			if(OPCACHE_ENABLE)
				opcache_invalidate($filename);
			return $return;
		}
	}
	if (isset($_cache[$name]))
		return $_cache[$name];
	// 获取缓存数据
	if (is_file($filename)) {
		$value          =   include $filename;
		$_cache[$name]  =   $value;
	} else {
		$value          =   false;
	}
	return $value;
}

/**
 * 取得对象实例 支持调用类的静态方法
 */
function get_instance_of($name, $method='', $args=array()) {
	static $_instance = array();
	$identify = empty($args) ? $name . $method : $name . $method . to_guid_string($args);
	if (!isset($_instance[$identify])) {
		if (class_exists($name)) {
			$o = new $name();
			if (method_exists($o, $method)) {
				if (!empty($args)) {
					$_instance[$identify] = call_user_func_array(array(&$o, $method), $args);
				} else {
					$_instance[$identify] = $o->$method();
				}
			}
			else
				$_instance[$identify] = $o;
		}
		else
			halt(L('_CLASS_NOT_EXIST_') . ':' . $name);
	}
	return $_instance[$identify];
}

/**
 * 根据PHP各种类型变量生成唯一标识号
 * @param mixed $mix 变量
 * @return string
 */
function to_guid_string($mix) {
	if (is_object($mix) && function_exists('spl_object_hash')) {
		return spl_object_hash($mix);
	} elseif (is_resource($mix)) {
		$mix = get_resource_type($mix) . strval($mix);
	} else {
		$mix = serialize($mix);
	}
	return md5($mix);
}

/**
 * 获取客户端IP地址
 * @param integer $type 返回类型 0 返回IP地址 1 返回IPV4地址数字
 * @return mixed
 */
function get_client_ip($type = 0) {
	$type       =  $type ? 1 : 0;
	static $ip  =   NULL;
	if ($ip !== NULL) return $ip[$type];
	if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
		$arr    =   explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
		$pos    =   array_search('unknown',$arr);
		if(false !== $pos) unset($arr[$pos]);
		$ip     =   trim($arr[0]);
	}elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
		$ip     =   $_SERVER['HTTP_CLIENT_IP'];
	}elseif (isset($_SERVER['REMOTE_ADDR'])) {
		$ip     =   $_SERVER['REMOTE_ADDR'];
	}
	// IP地址合法验证
	$long = sprintf("%u",ip2long($ip));
	$ip   = $long ? array($ip, $long) : array('0.0.0.0', 0);
	return $ip[$type];
}
 

/**
 * 日志处理类
 * @category   Think
 * @package  Think
 * @subpackage  Core
 * @author    liu21st <liu21st@gmail.com>
 */
class Log {

	// 日志级别 从上到下，由低到高
	const EMERG     = 'EMERG';  // 严重错误: 导致系统崩溃无法使用
	const ALERT     = 'ALERT';  // 警戒性错误: 必须被立即修改的错误
	const CRIT      = 'CRIT';  // 临界值错误: 超过临界值的错误，例如一天24小时，而输入的是25小时这样
	const ERR       = 'ERR';  // 一般错误: 一般性错误
	const WARN      = 'WARN';  // 警告性错误: 需要发出警告的错误
	const NOTICE    = 'NOTIC';  // 通知: 程序可以运行但是还不够完美的错误
	const INFO      = 'INFO';  // 信息: 程序输出信息
	const DEBUG     = 'DEBUG';  // 调试: 调试信息
	const SQL       = 'SQL';  // SQL：SQL语句 注意只在调试模式开启时有效

	// 日志记录方式
	const SYSTEM    = 0;
	const MAIL      = 1;
	const FILE      = 3;
	const SAPI      = 4;

	// 日志信息
	static $log     =  array();

	// 日期格式
	static $format  =  '[Y-m-d H:i:s]';

	/**
	 * 记录日志 并且会过滤未经设置的级别
	 * @static
	 * @access public
	 * @param string $message 日志信息
	 * @param string $level  日志级别
	 * @param boolean $record  是否强制记录
	 * @return void
	 */
	static function record($message,$level=self::ERR,$record=false) {
		if(IS_CLI){
			self::write($message,$level);
			return;
		}
		if($record || false !== strpos(C('LOG_LEVEL'),$level)) {
			self::$log[] =   "{$level}: {$message}\r\n";
		}
	}

	/**
	 * 日志保存  把record记录下的日志保存
	 * @static
	 * @access public
	 * @param integer $type 日志记录方式
	 * @param string $destination  写入目标
	 * @param string $extra 额外参数
	 * @return void
	 */
	static function save($type='',$destination='',$extra='') {
		if(empty(self::$log))return;
		$type = $type?$type:C('LOG_TYPE');
		if(self::FILE == $type) { // 文件方式记录日志信息
			if(empty($destination))
				$destination = LOG_PATH.date('y_m_d').'.log';
			//检测日志文件大小，超过配置大小则备份日志文件重新生成
			if(is_file($destination) && floor(C('LOG_FILE_SIZE')) <= filesize($destination) )
				  rename($destination,dirname($destination).'/'.time().'-'.basename($destination));
		}else{
			$destination   =   $destination?$destination:C('LOG_DEST');
			$extra   =  $extra?$extra:C('LOG_EXTRA');
		}
		$now = date(self::$format);
		error_log(MODE_NAME.$now.' '.get_client_ip().' '.(IS_CLI ? $GLOBALS['argv'][0].' '.$GLOBALS['argv'][1]: $_SERVER['REQUEST_URI'])."\r\n".implode('',self::$log)."\r\n", $type,$destination ,$extra);
		// 保存后清空日志缓存
		self::$log = array();
		//clearstatcache();
	}

	/**
	 * 日志直接写入  write('msg','ERR',3,'corn')
	 * @static
	 * @access public
	 * @param string $message 日志信息
	 * @param string $level  日志级别
	 * @param integer $type 日志记录方式
	 * @param string $destination  写入目标
	 * @param string $extra 额外参数
	 * @return void
	 */
	static function write($message,$level=self::ERR,$type='',$destination='',$extra='') {
		$now = date(self::$format);
		$type = $type?$type:C('LOG_TYPE');
		if(self::FILE == $type) { // 文件方式记录日志
			if(empty($destination)){
				$destination = LOG_PATH.date('y_m_d').'.log';
			}else{
				$destination = LOG_PATH.$destination.'.log';
			}
			//检测日志文件大小，超过配置大小则备份日志文件重新生成
			if(is_file($destination) && floor(C('LOG_FILE_SIZE')) <= filesize($destination) )
				  rename($destination,dirname($destination).'/'.time().'-'.basename($destination));
		}else{
			$destination   =   $destination?$destination:C('LOG_DEST');
			$extra   =  $extra?$extra:C('LOG_EXTRA');
		}
		error_log(MODE_NAME."{$now} {$level}: {$message}\r\n", $type,$destination,$extra );
	}

}
 
/**
 * 命令模式应用程序类
 */
class App {
    /**
     * 执行应用程序
     * @access public
     * @return void
     */
    static public function run() {
		define('NOW_TIME',      $_SERVER['REQUEST_TIME']);
        date_default_timezone_set(C('DEFAULT_TIMEZONE'));
        //采用 index.php module/action/id/4
		$depr = C('URL_PATHINFO_DEPR');
		$path   = isset($_SERVER['argv'][1])?$_SERVER['argv'][1]:'';
		if(!empty($path)) {
			$params = explode($depr,trim($path,$depr));
		}
		// 取得模块和操作名称 index.php module/action/id/4
		define('MODULE_NAME',   !empty($params)?array_shift($params):C('DEFAULT_MODULE'));
		define('ACTION_NAME',  !empty($params)?array_shift($params):C('DEFAULT_ACTION'));
		if(count($params)>1) {
			// 解析剩余参数 并采用GET方式获取
			for($i=0;$i<count($params);$i=$i+2)	$_GET[$params[$i]]=$params[$i+1];
		}
		G('initTime');
        // 执行操作
        $module  =  A(MODULE_NAME);
        if(!$module) {
            // 是否定义Empty模块
            $module = A("Empty");
            if(!$module){
                // 模块不存在 抛出异常
                throw_exception(L('_MODULE_NOT_EXIST_').MODULE_NAME);
            }
        }
        call_user_func(array(&$module,ACTION_NAME));
        // 保存日志记录
        // if(C('LOG_RECORD')) Log::save();
		// if(C('SHOW_PAGE_TRACE'))	tag('app_end');
		tag('view_end_filter',$content);
		echo $content;
        return ;
    }

};
 
/**
 * JETEE 命令模式Action控制器基类
 */
abstract class Action {

   /**
     * 架构函数
     * @access public
     */
    public function __construct() {
    }

    /**
     * 魔术方法 有不存在的操作的时候执行
     * @access public
     * @param string $method 方法名
     * @param array $parms 参数
     * @return mixed
     */
    public function __call($method,$parms) {
        if(strtolower($method) == strtolower(ACTION_NAME)) {
            // 如果定义了_empty操作 则调用
            if(method_exists($this,'_empty')) {
                $this->_empty($method,$parms);
            }else {
                // 抛出异常
                exit(L('_ERROR_ACTION_').ACTION_NAME);
            }
        }else{
            exit(__CLASS__.':'.$method.L('_METHOD_NOT_EXIST_'));
        }
    }

}Jetee::addMap(array (
  'PdoMysql' => 'E:\\w\\my_share\\ma863.tk\\jetee/Lib/Core/PdoMysql.class.php',
  'Cache' => 'E:\\w\\my_share\\ma863.tk\\jetee/Lib/Core/Cache.class.php',
  'Debug' => 'E:\\w\\my_share\\ma863.tk\\jetee/Lib/Util/Debug.class.php',
));
L(array (
  '_MODULE_NOT_EXIST_' => '无法加载模块',
  '_ERROR_ACTION_' => '非法操作',
  '_LANGUAGE_NOT_LOAD_' => '无法加载语言包',
  '_TEMPLATE_NOT_EXIST_' => '模板不存在',
  '_MODULE_' => '模块',
  '_ACTION_' => '操作',
  '_ACTION_NOT_EXIST_' => '控制器不存在或者没有定义',
  '_MODEL_NOT_EXIST_' => '模型不存在或者没有定义',
  '_VALID_ACCESS_' => '没有权限',
  '_XML_TAG_ERROR_' => 'XML标签语法错误',
  '_DATA_TYPE_INVALID_' => '非法数据对象！',
  '_OPERATION_WRONG_' => '操作出现错误',
  '_NOT_LOAD_DB_' => '无法加载数据库',
  '_NO_DB_DRIVER_' => '无法加载数据库驱动',
  '_NOT_SUPPORT_DB_' => '系统暂时不支持数据库',
  '_NO_DB_CONFIG_' => '没有定义数据库配置',
  '_NOT_SUPPERT_' => '系统不支持',
  '_CACHE_TYPE_INVALID_' => '无法加载缓存类型',
  '_FILE_NOT_WRITEABLE_' => '目录（文件）不可写',
  '_METHOD_NOT_EXIST_' => '您所请求的方法不存在！',
  '_CLASS_NOT_EXIST_' => '实例化一个不存在的类！',
  '_CLASS_CONFLICT_' => '类名冲突',
  '_TEMPLATE_ERROR_' => '模板引擎错误',
  '_CACHE_WRITE_ERROR_' => '缓存文件写入失败！',
  '_TAGLIB_NOT_EXIST_' => '标签库未定义',
  '_OPERATION_FAIL_' => '操作失败！',
  '_OPERATION_SUCCESS_' => '操作成功！',
  '_SELECT_NOT_EXIST_' => '记录不存在！',
  '_EXPRESS_ERROR_' => '表达式错误',
  '_TOKEN_ERROR_' => '表单令牌错误',
  '_RECORD_HAS_UPDATE_' => '记录已经更新',
  '_NOT_ALLOW_PHP_' => '模板禁用PHP代码',
  '_PARAM_ERROR_' => '参数错误或者未定义',
  'sex' => 
  array (
    0 => '保密',
    1 => '先生',
    2 => '女士',
  ),
  'user_type' => 
  array (
    10 => '个人',
    20 => '企业',
    30 => '其它',
  ),
  'zc_type' => 
  array (
    10 => '成品众创',
    20 => '原创众创',
  ),
  'zc_type1' => 
  array (
    10 => '成品',
    20 => '原创',
  ),
  'status' => 
  array (
    0 => '未审核',
    1 => '已审核',
    4 => '已删除',
    8 => '众创成功',
  ),
  'change_type' => 
  array (
    1 => '充值',
    5 => '提现',
    8 => '管理员调节',
    10 => '众创成品',
    20 => '众创原创',
  ),
));C(array (
  'app_file_case' => false,
  'app_tags_on' => true,
  'app_sub_domain_deploy' => false,
  'app_sub_domain_rules' => 
  array (
  ),
  'app_sub_domain_deny' => 
  array (
  ),
  'app_group_list' => 'Home,Admin',
  'app_group_path' => 'Modules',
  'action_suffix' => '',
  'load_ext_file' => '',
  'load_ext_config' => '',
  'cookie_expire' => 0,
  'cookie_domain' => '',
  'cookie_path' => '/',
  'cookie_prefix' => '',
  'default_m_layer' => 'Model',
  'default_c_layer' => 'Action',
  'default_v_layer' => 'Tpl',
  'default_app' => '@',
  'default_lang' => 'zh-cn',
  'default_theme' => '',
  'default_group' => 'Home',
  'default_module' => 'Index',
  'default_action' => 'index',
  'default_charset' => 'utf-8',
  'default_timezone' => 'PRC',
  'default_ajax_return' => 'JSON',
  'default_jsonp_handler' => 'jsonpReturn',
  'default_filter' => 'trim,jeHtmlspecialchars',
  'db_type' => 'mysql',
  'db_host' => '127.0.0.1',
  'db_name' => 'zc_ma863_com',
  'db_user' => 'zc_ma863_com',
  'db_pwd' => 'k@#$%tMza863_DS*zMza8*$MzDS*5S63_DS*5S%^&',
  'db_port' => '3306',
  'db_prefix' => 'je_',
  'db_fieldtype_check' => false,
  'db_fields_cache' => true,
  'db_charset' => 'utf8',
  'db_deploy_type' => 0,
  'db_rw_separate' => false,
  'db_master_num' => 1,
  'db_slave_no' => '',
  'db_sql_build_cache' => true,
  'db_sql_build_queue' => 'file',
  'db_sql_build_length' => 20,
  'db_sql_log' => false,
  'data_cache_time' => NULL,
  'data_cache_compress' => false,
  'data_cache_check' => false,
  'data_cache_prefix' => '',
  'data_cache_type' => 'Redis',
  'data_cache_path' => './app/Home/Runtime/Temp/',
  'data_cache_subdir' => false,
  'data_path_level' => 1,
  'error_message' => '页面错误！请稍后再试～',
  'error_page' => '',
  'show_error_msg' => false,
  'trace_exception' => false,
  'log_record' => false,
  'log_type' => 3,
  'log_dest' => '',
  'log_extra' => '',
  'log_level' => 'EMERG,ALERT,CRIT,ERR',
  'log_file_size' => 2097152,
  'log_exception_record' => true,
  'session_auto_start' => true,
  'session_options' => 
  array (
    'expire' => 864000,
    'name' => '___s_token___',
  ),
  'session_type' => 'Redis',
  'session_prefix' => '',
  'tmpl_content_type' => 'text/html',
  'tmpl_action_error' => 'E:\\w\\my_share\\ma863.tk\\jetee/Tpl/dispatch_jump.tpl',
  'tmpl_action_success' => 'E:\\w\\my_share\\ma863.tk\\jetee/Tpl/dispatch_jump.tpl',
  'tmpl_exception_file' => 'E:\\w\\my_share\\ma863.tk\\jetee/Tpl/think_exception.tpl',
  'tmpl_detect_theme' => false,
  'tmpl_template_suffix' => '.html',
  'tmpl_file_depr' => '_',
  'url_case_insensitive' => true,
  'url_pathinfo_depr' => '/',
  'url_pathinfo_fetch' => 'ORIG_PATH_INFO,REDIRECT_PATH_INFO,REDIRECT_URL',
  'url_html_suffix' => 'html',
  'url_deny_suffix' => 
  array (
    0 => 'ico',
    1 => 'png',
    2 => 'gif',
    3 => 'jpg',
  ),
  'url_params_bind' => true,
  'url_404_redirect' => '',
  'var_group' => 'g',
  'var_module' => 'm',
  'var_action' => 'a',
  'var_ajax_submit' => 'ajax',
  'var_jsonp_handler' => 'callback',
  'var_pathinfo' => 's',
  'var_template' => 't',
  'output_encode' => true,
  'http_cache_control' => 'private',
  'cookie_secure' => '',
  'cookie_httponly' => true,
  'redis_host' => '127.0.0.1',
  'redis_port' => '6379',
  'redis_password' => '',
  'redis_select' => 3,
  'token_on' => true,
  'token_name' => '___t_token___',
  'token_type' => 'md5',
  'token_reset' => true,
  'js_mod' => 'min',
  'email_gap_time' => 60,
  'sn_captcha_email' => 'captcha_email',
  'sn_email_send_time' => 'email_send_time',
  'sn_email_captcha' => 'email_captcha',
  'sms_send_gap' => 60,
  'default_wechat_config' => 'default_wechat_config',
  'thumb' => 'Uploads/project/',
  'show_run_time' => true,
  'html_cache_on' => true,
  'html_cache_rules' => 
  array (
    'Index:index' => 
    array (
      0 => '{:app}_{:group}_{:module}_{:action}',
      1 => 0,
    ),
  ),
  'tags' => 
  array (
    'view_end_filter' => 
    array (
      0 => 'ShowRuntime',
    ),
  ),
));G('loadTime');Jetee::Start();